﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _13_Builder
{
    /*
       抽象构建过程

       建造者模式要求构建过程是稳定的。
       任何流程的过程都可以进行建造抽象。

     */
    abstract class PersonBuilder
    {
        public abstract void BuildHead();
        public abstract void BuildBody();
        public abstract void BuildArmLeft();
        public abstract void BuildArmRight();
        public abstract void BuildLegLeft();
        public abstract void BuildLegRight();
    }

    /*
     * 实现流程的具体实体
     */
    class PersonThinBuilder : PersonBuilder
    {
        public override void BuildArmLeft()
        {
            Console.WriteLine("构建瘦子左臂");
        }

        public override void BuildArmRight()
        {
            Console.WriteLine("构建瘦子右臂");
        }

        public override void BuildBody()
        {
            Console.WriteLine("构建瘦子躯干");
        }

        public override void BuildHead()
        {
            Console.WriteLine("构建瘦子头");
        }

        public override void BuildLegLeft()
        {
            Console.WriteLine("构建瘦子左腿");
        }

        public override void BuildLegRight()
        {
            Console.WriteLine("构建瘦子右腿");
        }
    }

    /* 
     * 构建者中的指挥者 用他来控制建造过程，同时也用它来隔离用户与建造过程的关系
     */
    class PersonDirector
    {
        private PersonBuilder pb;

        public PersonDirector(PersonBuilder pb)
        {
            this.pb = pb;
        }
        /* 具体的构建过程 这里是具体的业务代码 ，客户不需要管这些 */
        public void CreatePerson()
        {
            pb.BuildHead();
            pb.BuildBody();
            pb.BuildArmLeft();
            pb.BuildArmRight();
            pb.BuildLegLeft();
            pb.BuildLegRight();
        }
    }
}
